package com.hongyi.service.Impl;

import com.hongyi.mapper.OrderMapper;
import com.hongyi.mapper.UserMapper;
import com.hongyi.pojo.Order;
import com.hongyi.pojo.User;
import com.hongyi.service.UserService;
import com.hongyi.vo.UserVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @Author: hongyi
 * @CreateTime: 2024-08-29
 */



@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper userMapper;

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public List<UserVo> findAll() {
        return userMapper.findAll();
    }

    @Override
    public UserVo userByIdWithOrders(Long id) {
        // 主表查询
       User user =  userMapper.getById(id);

       // 根据主表id即 user_id 去从表中进行查询
        List<Order> orderList = orderMapper.getByUserId(id);

        // 创建一个返回对象
        UserVo userVo = new UserVo();
        BeanUtils.copyProperties(user,userVo);
        userVo.setOrderList(orderList);

        return userVo;
    }

//    @Override
//    public List<UserVo> userListOrder() {
//        List<UserVo> userVoArrayList = new ArrayList();
//        // 先查询user表的人id
//        List<User> userList = userMapper.findUserAll();
//        // 然后在根据usreid去order表进行查询
//        List<Long> userIdlist = new ArrayList();
//        if (userList != null && userList.size() > 0) {
//            for (User user : userList) {
////                userIdlist.add(Long.valueOf(user.getId()));
//                List<Order> orderList = orderMapper.getByUserId(Long.valueOf(user.getId()));
//                UserVo userVo = new UserVo();
//                BeanUtils.copyProperties(user, userVo);
//                userVo.setOrderList(orderList);
//                userVoArrayList.add(userVo);
//            }
////            List<Order> orderList = orderMapper.getOrderUserIds(userIdlist);
//
//
//        }
//
//
//        return userVoArrayList;
//    }


    @Override
    public List<UserVo> userListOrder() {
        // 1. 查询所有用户
        List<User> userList = userMapper.findUserAll();
        List<UserVo> userVoList = new ArrayList<>();

        // 空值校验：无用户直接返回空列表
        if (userList == null || userList.isEmpty()) {
            return userVoList;
        }

        // 2. 收集所有用户ID（用于批量查询订单）
        List<Long> userIdList = new ArrayList<>();
        for (User user : userList) {
            userIdList.add(Long.valueOf(user.getId())); // 直接添加Long类型（假设user.getId()返回Long）
        }

        // 3. 批量查询所有订单（根据用户ID列表）
        List<Order> allOrders = orderMapper.getOrderUserIds1(userIdList);

        /**
         * 将订单列表按用户ID分组，例如使用Map<Long, List>，其中键是用户ID，值是该用户的所有订单
         * 优化方案
         * 采用批量查询+数据分组的方式，将订单查询次数从N次减少到1次：
         *
         * 先查询所有用户ID；
         * 批量查询所有相关订单（根据用户ID）；
         * 将订单按用户ID分组，最后关联到用户
         */
        // 4. 将订单按用户ID分组（键：用户ID，值：该用户的订单列表）
        Map<Long, List<Order>> orderGroup = new HashMap<>();
        for (Order order : allOrders) {
            Long userId = Long.valueOf(order.getUserId());
            // 若用户ID不存在于map中，初始化一个空列表
            if (!orderGroup.containsKey(userId)) {
                orderGroup.put(userId, new ArrayList<>()); // key userId , List<Order>
            }
            // 将订单添加到对应用户的列表中
            orderGroup.get(userId).add(order);
        }

        // 5. 构建UserVo列表（关联订单）
        for (User user : userList) {
            UserVo userVo = new UserVo();
            // 复制用户属性到UserVo（假设BeanUtils已处理null安全）
            BeanUtils.copyProperties(user, userVo);

            // 从分组中获取该用户的订单（无订单则为空列表）

            List<Order> userOrders = orderGroup.get(Long.valueOf(user.getId()));
//            userVo.setOrderList(userOrders != null ? userOrders : new ArrayList<>());
            userVo.setOrderList(userOrders);

            userVoList.add(userVo);
        }

        return userVoList;
    }


}
